\chapter{QtPlugin}

QtPlugin 头文件定义用于定义插件的宏。

\begin{tabular}{|l|l|}
\hline
属性 &	方法\\
\hline
头文件:& 	\#include <QtPlugin>\\
\hline
\end{tabular}

\section{宏}

\begin{tabular}{|l|}
\hline
宏名 \\
\hline
Q\_DECLARE\_INTERFACE(ClassName, Identifier) \\ 
\hline
Q\_IMPORT\_PLUGIN(PluginName) \\ 
\hline
Q\_PLUGIN\_METADATA(...) \\
\hline
\end{tabular}




%%%%%%%%%%%

\section{详细介绍}
另请参阅 如何创建 Qt 插件。

\section{宏文档}

Q\_DECLARE\_INTERFACE(ClassName, Identifier)

该宏将给定的 Identifier（字符串字面量）与名为 ClassName 的接口类关联。
Identifier 必须是唯一的。例如：

\begin{cppcode}
#define BrushInterface_iid "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface/1.0"

Q_DECLARE_INTERFACE(BrushInterface, BrushInterface_iid)
\end{cppcode}

通常在头文件中 ClassName 的类定义之后立即使用此宏。有关详细信息，请参见插件与绘制示例。

如果要对命名空间中的接口类使用 Q\_DECLARE\_INTERFACE，请务必保证 Q\_DECLARE\_INTERFACE 不在命名空间中。例如：

\begin{cppcode}
namespace Foo
{
    struct MyInterface { ... };
}

Q_DECLARE_INTERFACE(Foo::MyInterface, "org.examples.MyInterface")
\end{cppcode}

\begin{cppcode}
Q\_INTERFACES() 和如何创建 Qt 插件。
\end{cppcode}

Q\_IMPORT\_PLUGIN(PluginName)

该宏导入名为 PluginName 的插件，
该插件与使用 Q\_PLUGIN\_METADATA() 声明插件元数据的类的名称相对应。

将该宏插入应用程序的源代码来使您能够使用静态插件。

例如：

\begin{cppcode}
Q_IMPORT_PLUGIN(qjpeg)
\end{cppcode}

构建应用程序时，链接器必须包含静态插件。对于 Qt 预定义的插件，可以使用 QTPLUGIN 将插件加入你的构建系统。例如：

\begin{cppcode}
TEMPLATE      = app
QTPLUGIN     += qjpeg qgif    # image formats
\end{cppcode}


\begin{seeAlso}
 静态插件、如何创建 Qt 插件以及 qmake 入门。
\end{seeAlso}

Q\_PLUGIN\_METADATA(...)

该宏用于声明插件元数据，它是实例化此对象的插件的一部分。

该宏需要声明通过该对象实现的接口的 IID，并引用包含该插件的元数据的文件。

对于某一个 Qt 插件，该宏在源代码中应恰好出现一次。

示例：

\begin{cppcode}
class MyInstance : public QObject
{
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDummyPlugin" FILE "mymetadata.json")
};
\end{cppcode}

有关详细信息，请参见插件与绘制示例。

请注意，该宏出现的类必须是可默认构造的。

FILE是可选的，并指向一个 json 文件。

该 json 文件必须存在于构建系统指定的包含目录之一中。当找不到指定文件时，moc 将退出并显示错误。

该宏在 Qt 5.0 中引入。

\begin{seeAlso}
Q\_DECLARE\_INTERFACE() 和如何创建 Qt 插件。
\end{seeAlso}